﻿using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.IO;
using Newtonsoft.Json;

namespace Json2sdb
{
    /// <summary>
    /// 将具有固定结构的 JSON 数据转换为 .sdb 格式的 SQLite 数据库文件
    /// 适用于已知类结构（如 Person）
    /// </summary>
    public static class FixedJsonToSdbConverter
    {
        /// <summary>
        /// 将 JSON 字符串转换为 .sdb 文件
        /// </summary>
        /// <param name="json">JSON 字符串（数组格式）</param>
        /// <param name="dbFile">输出的 .sdb 文件路径</param>
        /// <typeparam name="T">数据类型，需有默认构造函数</typeparam>
        public static void Convert<T>(string json, string dbFile) where T : class, new()
        {
            if (string.IsNullOrWhiteSpace(json))
                throw new ArgumentException("JSON 数据不能为空");

            if (string.IsNullOrWhiteSpace(dbFile))
                throw new ArgumentException("数据库文件路径无效");

            // 删除已存在的文件
            if (File.Exists(dbFile))
                File.Delete(dbFile);

            // 反序列化 JSON 到对象列表
            var dataList = JsonConvert.DeserializeObject<List<T>>(json);
            if (dataList == null || dataList.Count == 0)
                throw new InvalidOperationException("JSON 反序列化失败或数据为空");

            // 创建 SQLite 数据库并插入数据
            using (var connection = new SQLiteConnection($"Data Source={dbFile};Version=3;"))
            {
                connection.Open();

                // 使用事务提高性能
                using (var transaction = connection.BeginTransaction())
                {
                    CreateOrResetTable<T>(connection, transaction);
                    InsertData<T>(connection, transaction, dataList);
                    transaction.Commit();
                }
            }
        }

        /// <summary>
        /// 根据泛型类型创建表（目前手动定义字段，可扩展为反射自动建表）
        /// </summary>
        private static void CreateOrResetTable<T>(SQLiteConnection connection, SQLiteTransaction transaction)
        {
            string sql = typeof(T) == typeof(Person)
                ? @"
                CREATE TABLE IF NOT EXISTS People (
                    Id INTEGER PRIMARY KEY,
                    Name TEXT,
                    Age INTEGER,
                    City TEXT
                );"
                : throw new NotSupportedException($"不支持的类型: {typeof(T).Name}");

            using (var cmd = new SQLiteCommand(sql, connection, transaction))
            {
                cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 插入数据到表中
        /// </summary>
        private static void InsertData<T>(SQLiteConnection connection, SQLiteTransaction transaction, List<T> dataList)
        {
            if (typeof(T) == typeof(Person))
            {
                string sql = "INSERT INTO People (Id, Name, Age, City) VALUES (@id, @name, @age, @city)";
                foreach (T t in dataList)
                {
                    Person p = t as Person;
                    using (var cmd = new SQLiteCommand(sql, connection, transaction))
                    {
                        cmd.Parameters.AddWithValue("@id", p.Id);
                        cmd.Parameters.AddWithValue("@name", p.Name ?? "");
                        cmd.Parameters.AddWithValue("@age", p.Age);
                        cmd.Parameters.AddWithValue("@city", p.City ?? "");
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            else
            {
                throw new NotSupportedException($"不支持的数据类型: {typeof(T).Name}");
            }
        }

        /// <summary>
        /// 从 JSON 文件加载数据并转换为 .sdb
        /// </summary>
        /// <param name="jsonFilePath">JSON 文件路径</param>
        /// <param name="dbFile">输出的 .sdb 文件路径</param>
        /// <typeparam name="T">数据类型</typeparam>
        public static void ConvertFromFile<T>(string jsonFilePath, string dbFile) where T : class, new()
        {
            if (!File.Exists(jsonFilePath))
                throw new FileNotFoundException($"JSON 文件未找到：{jsonFilePath}");

            string json = File.ReadAllText(jsonFilePath, System.Text.Encoding.UTF8);
            Convert<T>(json, dbFile); // 复用原有方法
        }
    }
}
